package com.common.baselibrary.util;


import com.common.baselibrary.interfaces.ContentConverter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;

/**
 * 文本工具类
 * Created by xuyougen
 * 2019/9/18.
 */
public class TextHelper {

    /**
     * 字符串是否为空或者null
     *
     * @param str 需要判断的字符串
     * @return true为空或者null
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    /**
     * trim之后判断字符串是否为空
     *
     * @param str 需要判断的字符串
     * @return true为空或者null
     */
    public static boolean isEmptyAfterTrim(String str) {
        return isEmpty(str) || str.trim().length() == 0;
    }

    /**
     * trim，如果为null返回空字符串
     *
     * @param text 需要处理的字符串
     * @return trim后的字符串
     */
    public static String trim(String text) {
        return isEmpty(text) ? "" : text.trim();
    }

    /**
     * 从字符串中移除指定的字符
     *
     * @param resource  源字符串
     * @param character 需要移除的字符
     * @return 处理后的字符串
     */
    public static String removeSpecificCharacterFromString(String resource, char character) {
        if (isEmpty(resource)) return "";
        StringBuilder builder = new StringBuilder();
        int index = 0;
        while (index < resource.length()) {
            char ch = resource.charAt(index++);
            if (ch == character) continue;
            builder.append(ch);
        }
        return builder.toString();
    }

    /**
     * 将文本转换成int值
     *
     * @param text         文本
     * @param defaultValue 转换出错返回的默认值
     * @return int
     */
    public static int toInteger(String text, int defaultValue) {
        if (isEmptyAfterTrim(text)) return defaultValue;
        try {
            return Integer.parseInt(text);
        } catch (Exception e) {
            LogHelper.e(String.format("文本'%s'转数字出现异常", text));
            return defaultValue;
        }
    }

    /**
     * 将文本转换成long值
     *
     * @param text         文本
     * @param defaultValue 转换出错返回的默认值
     * @return long
     */
    public static Long toLong(String text, long defaultValue) {
        if (isEmptyAfterTrim(text)) return defaultValue;
        try {
            return Long.parseLong(text);
        } catch (Exception e) {
            LogHelper.e(String.format("文本'%s'转数字出现异常", text));
            return defaultValue;
        }
    }

    /**
     * 移除重复的字符串
     *
     * @param list 源数据列表
     * @return 新的数据列表
     */
    public static List<String> removeRepeatedStrings(List<String> list) {
        HashMap<String, String> map = new HashMap<>();
        for (String str : list)
            map.put(str, str);
        return new ArrayList<>(map.keySet());
    }

    /**
     * 将list转换成字符串
     *
     * @param list      list
     * @param join      连接符
     * @param converter 转换器，目的将对象转换成字符串
     * @param <T>       对象类型
     * @return 以join为拼接符的字符串
     */
    @SuppressWarnings("unchecked")
    public static <T> String listToString(List<T> list, String join, ContentConverter<String, T> converter) {
        Objects.requireNonNull(list);
        return arrayToString((T[]) list.toArray(), join, converter);
    }

    /**
     * 将数组转换成字符串
     *
     * @param array     数组
     * @param join      连接符
     * @param converter 转换器，目的将对象转换成字符串
     * @param <T>       对象类型
     * @return 以join为拼接符的字符串
     */
    public static <T> String arrayToString(T[] array, String join, ContentConverter<String, T> converter) {
        Objects.requireNonNull(array);
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < array.length; i++) {
            builder.append(converter.convert(array[i]));
            if (i < array.length - 1)
                builder.append(join);
        }
        return builder.toString();
    }

    /**
     * 将string转换成list
     *
     * @param string    字符串
     * @param split     分隔符
     * @param converter 转换器
     * @param <T>       list泛型
     * @return list
     */
    public static <T> ArrayList<T> stringToList(String string, String split, ContentConverter<T, String> converter) {
        Objects.requireNonNull(string);
        Objects.requireNonNull(split);
        ArrayList<T> arrayList = new ArrayList<>();
        String[] strings = string.split(split);
        for (String str : strings) {
            arrayList.add(converter.convert(str));
        }
        return arrayList;
    }

    public static String toString(Object object) {
        return object == null ? null : object.toString();
    }

    public static boolean equalsWithTrim(String text1, String text2) {
        return trim(text1).equals(trim(text2));
    }

}